from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet
from meiduo_admin.my_paginate import MyPageNumberPagination
from meiduo_admin.order import order_serializers
from orders.models import OrderInfo

# 订单视图集
class OrderViewSet(ReadOnlyModelViewSet):
    pagination_class = MyPageNumberPagination
    serializer_class = order_serializers.OrderViewSetSerializer
    # queryset = OrderInfo.objects.all()

    # 为了实现过滤查询的功能，需要重写这个方法
    def get_queryset(self):
        # 获取关键字
        keyword = self.request.query_params.get("keyword","") #是params传过来的，所以要用query_params接收
        # 返回结果
        return OrderInfo.objects.filter(order_id__contains=keyword).all() # 如果包含，就全部查出来返回


    """
    self.action是ModelViewSet中ViewSetMixin下的定义，
    self.action = self.action_map.get(method)，获取get方法
    """
    #q,重写get_serializer_class方法，返回不同的序列化器
    def get_serializer_class(self):
        if self.action == "retrieve":#如果是retrieve,就是获取单个，带了pk的，返回响应的结果
            return order_serializers.OrdersModelSerializer
        else:#否则
            return order_serializers.OrderViewSetSerializer#就是获取所有，返回所有数据

    # 2,修改订单状态
    @action(methods=['put'], detail=True)  # 格式: orders/pk/status  #路由直接通过action映射到视图集，不用写
    def status(self, request, pk):
        # 1,获取参数
        status = request.data.get("status")
        order = self.get_object()

        # 2,校验参数
        if not all([status, order]):
            return Response(status=403)

        # 3,数据入库
        order.status = status
        order.save()

        # 4,返回响应
        return Response(status=201)

